#include "gramBitMap.h"

#include "stdio.h"
#include "unistd.h"

//防止未定义错误
#ifndef GRAM_W
#define GRAM_W	(128)
#endif

//防止未定义错误
#ifndef GRAM_H
#define GRAM_H	(64)
#endif

//画点
void BitMapDrawPixel(unsigned char *gram, unsigned int x, unsigned int y, unsigned char mask)
{
    //判断是否越界
    if (x >= GRAM_W || y >= GRAM_H) return;

	// 判断空指针
	if (NULL == gram) return;

    //y轴反向
    y = GRAM_H - y - 1;

    //找到需要操作的字节
    if(mask) 	gram[x + (y/8) * GRAM_W] |=  (1 << (y % 8));
    else 		gram[x + (y/8) * GRAM_W] &= ~(1 << (y % 8));
}

//显示一个字符
void BitMapDrawChar(unsigned char *gram, int x, int y, char ch, _FontDef *font)
{
    const unsigned char *fontOffset;
	int xOffset, yOffset;
	unsigned int i, j, k;
	unsigned int bits;//当前字节的有效位数
    unsigned char temp;
	
	unsigned int Lbytes;//当前字体纵向占用的字节数

    //判断是否是合法字符
    if (ch < ' ' || ch > '~') return;

	// 判断是否是空指针
	if (NULL == font) return;

    fontOffset = font->data + ((ch - ' ') * font->FontSize);//获取字符偏移量
	
	Lbytes = font->FontSize / font->FontWidth;//获取当前字体在竖直方向上占用的字节数

	for (i = 0; i < Lbytes; i++)//一排一排的遍历
	{
		bits = font->FontHeight - (i * 8);//当前行字符的有效位
		bits = (bits > 8) ? (8) : (bits);
		
		yOffset = y + (i * 8);//当前字节的y偏移量
		
		for (j = 0; j < font->FontWidth; j++)
		{
			xOffset = x + j;//当前字节的x偏移量
			if (xOffset < 0 || xOffset >= GRAM_W) continue;//判断当前列是否越界
			
			temp = fontOffset[i * font->FontWidth + j];//拿出当前字节
			
			for(k = 0; k < bits; k++)
			{
				BitMapDrawPixel(gram, xOffset, yOffset + k, temp & 0x01);
				temp = temp >> 1;
			}
		}
	}
}
